package netWork;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 25397
 * Date: 2022-04-16
 * Time: 10:30
 */
//站在服务器的角度：
//1.源IP——服务器程序本机的IP
//2.源端口：服务器绑定的
//3.目的IP——包含在收到的数据报中（客户端IP）
//4.目的端口——包含在收到的数据报中（客户端的端口）
//5.协议类型：UDP
public class UdpEchoServer {

        //进行网络编程，第一步需要先准备好socket实例
        private DatagramSocket socket=null;

        public UdpEchoServer(int port) throws SocketException {
            socket=new DatagramSocket(port);
            //此处在构造服务器这把的socket对象的时候，就需要显式的绑定一个端口号
            //端口号是用来区分一个应用程序的，主机收到网卡上的数据时，这个数据该给哪个程序
            //（就类似于快递到小区了，现在要把快递送到哪户去）

        }

        //启动服务器
        public void start() throws IOException {
            System.out.println("启动服务器");
            //UDP不需要建立连接，直接接收从客户端来的数据即可
            while(true){
                //1.读取客户端发来的请求
                DatagramPacket requestPacket=new DatagramPacket(new byte[1024],1024);
                socket.receive(requestPacket);//为了接收数据，需要先准备好
                //requestPacket（DatagramPacket类型）表示一个UDP数据报，发送一次数据，就是再发一个DatagramPacket
                //接收一次数据，也就是在接收一个DatagramPacket

                //把DatagramPacket解析成一个String
                String request=new String(requestPacket.getData(),0,requestPacket.getLength(),"UTF-8");

                //2.根据请求来计算响应（由于我们这是一个回显服务，2就省略了）
                String response=process(request);

                //3.把响应写回到客户端
                DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());
                socket.send(requestPacket);
                System.out.printf("[%s:%d] req:%s, resp:%s\n",
                        requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);
                //ps:发送请求的——客户端；接收请求的——服务器


            }
        }
        //由于是回显服务，响应就和请求一样了
        //实际上对于一个真实的服务器来说，这个过程是最复杂的，为了实现这个过程，可能需要几万行
        public String process(String request) {
            return request;
        }

    public static void main(String[] args) throws IOException {
        UdpEchoServer server=new UdpEchoServer(1000);
        server.start();
    }

}
